From: Giovanni Campagna Date: Wed, 29 Aug 2012 17:42:11 +0000 (+0200) Subject: NetworkMenu: rework multiple NIC support X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~5434 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=490206b5b23649017859b9cb6d534cce1855d6dd;p=gnome-shell.git NetworkMenu: rework multiple NIC support Remove section titles for ethernet and mobile broadband, and replace them with device status items that recognize if multiple devices are installed in the same section, and if so automatically disambiguate. https://bugzilla.gnome.org/show_bug.cgi?id=677142 --- diff --git a/configure.ac b/configure.ac index d3755cf22..742737028 100644 --- a/configure.ac +++ b/configure.ac @@ -78,6 +78,7 @@ STARTUP_NOTIFICATION_MIN_VERSION=0.11 GCR_MIN_VERSION=3.3.90 GNOME_DESKTOP_REQUIRED_VERSION=3.7.1 GNOME_MENUS_REQUIRED_VERSION=3.5.3 +NETWORKMANAGER_MIN_VERSION=0.9.7 # Collect more than 20 libraries for a prize! PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION @@ -98,8 +99,9 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes - libnm-glib libnm-util gnome-keyring-1 - gcr-3 >= $GCR_MIN_VERSION) + libnm-glib libnm-util >= $NETWORKMANAGER_MIN_VERSION + libnm-gtk >= $NETWORKMANAGER_MIN_VERSION + gnome-keyring-1 gcr-3 >= $GCR_MIN_VERSION) PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0) diff --git a/js/misc/util.js b/js/misc/util.js index fb936c941..98c231030 100644 --- a/js/misc/util.js +++ b/js/misc/util.js @@ -159,86 +159,6 @@ function killall(processName) { } } -// This was ported from network-manager-applet -// Copyright 2007 - 2011 Red Hat, Inc. -// Author: Dan Williams - -const _IGNORED_WORDS = [ - 'Semiconductor', - 'Components', - 'Corporation', - 'Communications', - 'Company', - 'Corp.', - 'Corp', - 'Co.', - 'Inc.', - 'Inc', - 'Incorporated', - 'Ltd.', - 'Limited.', - 'Intel', - 'chipset', - 'adapter', - '[hex]', - 'NDIS', - 'Module' -]; - -const _IGNORED_PHRASES = [ - 'Multiprotocol MAC/baseband processor', - 'Wireless LAN Controller', - 'Wireless LAN Adapter', - 'Wireless Adapter', - 'Network Connection', - 'Wireless Cardbus Adapter', - 'Wireless CardBus Adapter', - '54 Mbps Wireless PC Card', - 'Wireless PC Card', - 'Wireless PC', - 'PC Card with XJACK(r) Antenna', - 'Wireless cardbus', - 'Wireless LAN PC Card', - 'Technology Group Ltd.', - 'Communication S.p.A.', - 'Business Mobile Networks BV', - 'Mobile Broadband Minicard Composite Device', - 'Mobile Communications AB', - '(PC-Suite Mode)' -]; - -function fixupPCIDescription(desc) { - desc = desc.replace(/[_,]/, ' '); - - /* Attempt to shorten ID by ignoring certain phrases */ - for (let i = 0; i < _IGNORED_PHRASES.length; i++) { - let item = _IGNORED_PHRASES[i]; - let pos = desc.indexOf(item); - if (pos != -1) { - let before = desc.substring(0, pos); - let after = desc.substring(pos + item.length, desc.length); - desc = before + after; - } - } - - /* Attmept to shorten ID by ignoring certain individual words */ - let words = desc.split(' '); - let out = [ ]; - for (let i = 0; i < words.length; i++) { - let item = words[i]; - - // skip empty items (that come out from consecutive spaces) - if (item.length == 0) - continue; - - if (_IGNORED_WORDS.indexOf(item) == -1) { - out.push(item); - } - } - - return out.join(' '); -} - // lowerBound: // @array: an array or array-like object, already sorted // according to @cmp diff --git a/js/ui/status/network.js b/js/ui/status/network.js index 5e4c4721a..9da066dab 100644 --- a/js/ui/status/network.js +++ b/js/ui/status/network.js @@ -5,6 +5,7 @@ const Gio = imports.gi.Gio; const Lang = imports.lang; const NetworkManager = imports.gi.NetworkManager; const NMClient = imports.gi.NMClient; +const NMGtk = imports.gi.NMGtk; const Signals = imports.signals; const St = imports.gi.St; @@ -139,46 +140,6 @@ const NMNetworkMenuItem = new Lang.Class({ } }); -const NMWiredSectionTitleMenuItem = new Lang.Class({ - Name: 'NMWiredSectionTitleMenuItem', - Extends: PopupMenu.PopupSwitchMenuItem, - - _init: function(label, params) { - params = params || { }; - params.style_class = 'popup-subtitle-menu-item'; - this.parent(label, false, params); - }, - - updateForDevice: function(device) { - if (device) { - this._device = device; - this.setStatus(device.getStatusLabel()); - this.setToggleState(device.connected); - } else - this.setStatus(''); - }, - - activate: function(event) { - this.parent(event); - - if (!this._device) { - log('Section title activated when there is more than one device, should be non reactive'); - return; - } - - let newState = this._switch.state; - - let ok; - if (newState) - ok = this._device.activate(); - else - ok = this._device.deactivate(); - - if (!ok) - this._switch.setToggleState(false); - } -}); - const NMWirelessSectionTitleMenuItem = new Lang.Class({ Name: 'NMWirelessSectionTitleMenuItem', Extends: PopupMenu.PopupSwitchMenuItem, @@ -351,7 +312,7 @@ const NMDevice = new Lang.Class({ this._autoConnectionItem = null; this._overflowItem = null; - this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' }); + this.statusItem = new PopupMenu.PopupSwitchMenuItem('', this.connected, { style_class: 'popup-subtitle-menu-item' }); this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) { let ok; if (state) @@ -512,6 +473,10 @@ const NMDevice = new Lang.Class({ } }, + syncDescription: function() { + this.statusItem.label.text = this.device._description; + }, + // protected _createAutomaticConnection: function() { throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection'); @@ -639,25 +604,6 @@ const NMDevice = new Lang.Class({ this.statusItem.setStatus(this.getStatusLabel()); this.emit('state-changed'); - }, - - _getDescription: function() { - let dev_product = this.device.get_product(); - let dev_vendor = this.device.get_vendor(); - if (!dev_product || !dev_vendor) - return ''; - - let product = Util.fixupPCIDescription(dev_product); - let vendor = Util.fixupPCIDescription(dev_vendor); - let out = ''; - - // Another quick hack; if all of the fixed up vendor string - // is found in product, ignore the vendor. - if (product.indexOf(vendor) == -1) - out += vendor + ' '; - out += product; - - return out; } }); @@ -867,10 +813,6 @@ const NMDeviceBluetooth = new Lang.Class({ this._clearSection(); this._queueCreateSection(); this._updateStatusItem(); - }, - - _getDescription: function() { - return this.device.name || _("Bluetooth"); } }); @@ -1651,15 +1593,14 @@ const NMApplet = new Lang.Class({ this._mobileUpdateId = 0; this._mobileUpdateDevice = null; + this._nmDevices = []; this._devices = { }; this._devices.wired = { section: new PopupMenu.PopupMenuSection(), devices: [ ], - item: new NMWiredSectionTitleMenuItem(_("Wired")) }; - this._devices.wired.section.addMenuItem(this._devices.wired.item); this._devices.wired.section.actor.hide(); this.menu.addMenuItem(this._devices.wired.section); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); @@ -1667,7 +1608,7 @@ const NMApplet = new Lang.Class({ this._devices.wireless = { section: new PopupMenu.PopupMenuSection(), devices: [ ], - item: this._makeToggleItem('wireless', _("Wireless")) + item: this._makeToggleItem('wireless', _("Wi-Fi")) }; this._devices.wireless.section.addMenuItem(this._devices.wireless.item); this._devices.wireless.section.actor.hide(); @@ -1677,9 +1618,7 @@ const NMApplet = new Lang.Class({ this._devices.wwan = { section: new PopupMenu.PopupMenuSection(), devices: [ ], - item: this._makeToggleItem('wwan', _("Mobile broadband")) }; - this._devices.wwan.section.addMenuItem(this._devices.wwan.item); this._devices.wwan.section.actor.hide(); this.menu.addMenuItem(this._devices.wwan.section); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); @@ -1762,16 +1701,23 @@ const NMApplet = new Lang.Class({ section.actor.hide(); else { section.actor.show(); - if (devices.length == 1) { - let dev = devices[0]; - dev.statusItem.actor.hide(); - item.updateForDevice(dev); - } else { - devices.forEach(function(dev) { - dev.statusItem.actor.show(); - }); - // remove status text from the section title item - item.updateForDevice(null); + + // Sync the relation between the section title + // item (the one with the airplane mode switch) + // and the individual device switches + if (item) { + if (devices.length == 1) { + let dev = devices[0]; + dev.statusItem.actor.hide(); + item.updateForDevice(dev); + } else { + devices.forEach(function(dev) { + dev.statusItem.actor.show(); + }); + + // remove status text from the section title item + item.updateForDevice(null); + } } } }, @@ -1779,8 +1725,9 @@ const NMApplet = new Lang.Class({ _readDevices: function() { let devices = this._client.get_devices() || [ ]; for (let i = 0; i < devices.length; ++i) { - this._deviceAdded(this._client, devices[i]); + this._deviceAdded(this._client, devices[i], true); } + this._syncDeviceNames(); }, _notifyForDevice: function(device, iconName, title, text, urgency) { @@ -1828,7 +1775,18 @@ const NMApplet = new Lang.Class({ return wrapper; }, - _deviceAdded: function(client, device) { + _syncDeviceNames: function() { + let names = NMGtk.utils_disambiguate_device_names(this._nmDevices); + for (let i = 0; i < this._nmDevices.length; i++) { + let device = this._nmDevices[i]; + if (device._description != names[i]) { + device._description = names[i]; + device._delegate.syncDescription(); + } + } + }, + + _deviceAdded: function(client, device, skipSyncDeviceNames) { if (device._delegate) { // already seen, not adding again return; @@ -1839,10 +1797,14 @@ const NMApplet = new Lang.Class({ let section = this._devices[wrapper.category].section; let devices = this._devices[wrapper.category].devices; - section.addMenuItem(wrapper.section, 1); - section.addMenuItem(wrapper.statusItem, 1); + section.addMenuItem(wrapper.statusItem); + section.addMenuItem(wrapper.section); devices.push(wrapper); + this._nmDevices.push(device); + if (!skipSyncDeviceNames) + this._syncDeviceNames(); + this._syncSectionTitle(wrapper.category); } }, @@ -1860,6 +1822,10 @@ const NMApplet = new Lang.Class({ let pos = devices.indexOf(wrapper); devices.splice(pos, 1); + pos = this._nmDevices.indexOf(device); + this._nmDevices.splice(pos, 1); + this._syncDeviceNames(); + this._syncSectionTitle(wrapper.category) },